/*
 ============================================================================
 Name        : TP3offline.c
 Authors     : Pablo de la Vega, Rodrigo Fernández
 Authors     : Emiliano Parizzi, Lucas Robles
 Version     : 0.0.1
 Copyright   : GNU
 Description : Árboles binarios, derivador de expresiones
 ============================================================================
 */


#include "literal.h"
#include "TDA_expresion.h"
#include "Fauxiliar.h"
#include "errores.h"

/**
@function
@name main
@author Rodrigo Fernández
@param argc: int
@param argv: char **
@return int
*/



void derivarsimple(char* strExpresion,char* var)
{
    TExpresion expr, deriv, simpl;
    char* string;

    Expresion_Crear(&expr);
    Expresion_Crear(&deriv);
    Expresion_Crear(&simpl);
    Expresion_Parsear(&expr, strExpresion, var);
    Expresion_Derivar(&expr, &deriv);
    Expresion_Simplificar(&deriv, &simpl);
    Expresion_AString(&simpl,&string);
    printf("Expresion derivada y simplificada: %s",string);
    Expresion_Destruir(&expr);
    Expresion_Destruir(&deriv);
    Expresion_Destruir(&simpl);
    free(string);
}

void derivararchivo(char* rutainput, char* rutaoutput, char* rutalog, char* var)
{
     TExpresion expr, deriv, simpl;
     char* string,*linea;
     FILE* input,*output,*log;
     int res;
     int error;

     input=fopen(rutainput,"rt");
     output=fopen(rutaoutput,"wt");

     res=getString(&linea,input);
     while (input && res!=-2)
     {

        Expresion_Crear(&expr);
        Expresion_Crear(&deriv);
        Expresion_Crear(&simpl);
        Expresion_Parsear(&expr, linea, var);
        Expresion_Derivar(&expr, &deriv);
        Expresion_Simplificar(&deriv, &simpl);
        Expresion_AString(&simpl,&string);
        fprintf(output,"%s \n",string);
        Expresion_Destruir(&expr);
        Expresion_Destruir(&deriv);
        Expresion_Destruir(&simpl);
        free(linea);
        free(string);
        res=getString(&linea, input);

     }


    fclose(input);
    fclose(output);


}


void TestDerivarCompleto(char* strExpresion, char* var)
{
    TExpresion expr, deriv, simpl;
    char* string;

    Expresion_Crear(&expr);
    Expresion_Crear(&deriv);
    Expresion_Crear(&simpl);

    Expresion_Parsear(&expr, strExpresion, var);
    printf("Expresion original: ");
    In_Order(expr.ABExp, RAIZ, MostrarLiteral);
    /*inorden(expr.ABExp,RAIZ);*/
    Expresion_Derivar(&expr, &deriv);
    printf("\nExpresion derivada: ");

    In_Order(deriv.ABExp, RAIZ, MostrarLiteral);
    printf("\n");
    Expresion_Simplificar(&deriv, &simpl);
    printf("\nExpresion derivada y simplificada: ");
    In_Order(simpl.ABExp, RAIZ, MostrarLiteral);
    printf("\n");
    Expresion_AString(&simpl,&string);


    printf("\n %s",string);

    Expresion_Destruir(&expr);
    Expresion_Destruir(&deriv);
    Expresion_Destruir(&simpl);
}


int main(int argc, char *argv[])
{
	if (argc >= 3){
		/* El programa es llamado para una expresión simple */
		if (strcmp(argv[1],"--single")==0)
                        {
                            derivarsimple(argv[2],argv[3]);

		}else /* El programa es llamado para procesar varias expresiones */
		if (strcmp(argv[1],"--file")==0){
			if (argc != 6){
				popError(NUMERO_ARGUMENTOS_INVALIDO);
				return EXIT_FAILURE;
			}
			if (archivoExiste(argv[2])==0){ /* Archivo de entrada no encontrado */
				popError(ARCHIVO_NO_ENCONTRADO);
				return EXIT_FAILURE;
			}

            derivararchivo(argv[2],argv[3],argv[4],argv[5]);


		}else{
			popError(ARGUMENTO_INVALIDO);
			return EXIT_FAILURE;
		}
	}else{
		popError(FALTA_PARAMETRO_REQUERIDO);
		return EXIT_FAILURE;

	}

	return 0;
}/* Fin del programa */


